package com.bsdsma.visonManagementSystemapp.restcontroller;

import com.bsdsma.visonManagementSystemapp.constants.ErrorCodes;
import com.bsdsma.visonManagementSystemapp.exceptionhandler.GlobalRuntimeException;
import com.bsdsma.visonManagementSystemapp.dto.UserAddDto;
import com.bsdsma.visonManagementSystemapp.dto.UserSearchDto;
import com.bsdsma.visonManagementSystemapp.dto.DataGroupByDateDto;
import com.bsdsma.visonManagementSystemapp.service.UserService;
import com.bsdsma.visonManagementSystemapp.utils.ResultUtils;
import com.bsdsma.visonManagementSystemapp.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

/**
 * 用户模块对外暴露api入口, 即可通过http请求访问到下面各个方法
 */
@RestController
@RequestMapping(value = "/api/user")
public class UserRestController {

    @Autowired
    private UserService userService;

    /**
     * 分页查询用户, 接收"HTTP GET"请求
     * @param search    入参, 查询条件对象
     */
    @GetMapping
    public Map<String, Object> search(UserSearchDto search){
        return ResultUtils.ok(userService.search(search));
    }

    /**
    * 查询所有用户, 接收"HTTP GET"请求
    */
    @GetMapping(value = "/list")
    public Map<String, Object> listAll(){
        return ResultUtils.ok(userService.listAll());
    }

    /**
    * 通过主键ID查询用户, 接收"HTTP GET"请求
    */
    @GetMapping(value = "/{role}/{id}")
    public Map<String, Object> getById(@PathVariable String role, @PathVariable Long id){
        if (StringUtils.hasText(role)) {
            if (!role.equals("学生") && !role.equals("教师") && !role.equals("超级管理员")) {
                throw new GlobalRuntimeException(ErrorCodes.PARAMS_ERROR, "无效的角色类型");
            }
            return ResultUtils.ok(userService.getById(role, id));
        } else {
            throw new GlobalRuntimeException(ErrorCodes.PARAMS_ERROR, "请指定用户角色");
        }
    }

    /**
     * 添加用户数据到数据库, 接收"HTTP POST"请求
     * @param entity    入参, 添加的字段对象
     */
    @PostMapping
    public Map<String, Object> add(@RequestBody UserAddDto entity){
        userService.add(entity, false);
        return ResultUtils.ok();
    }

    /**
     * 更新用户数据到数据库, 接收"HTTP POST"请求
     * @param id        主键ID, 更新需要一个唯一标识, 也就是主键ID
     * @param entity    入参, 更新的字段对象
     */
    @PostMapping(value = "/{id}")
    public Map<String, Object> update(@PathVariable Long id, @RequestBody UserAddDto entity){
        userService.update(id, entity);
        return ResultUtils.ok();
    }

    /**
     * 删除用户数据, 接收"HTTP DELETE"请求
     * @param role 用户角色
     * @param id    主键ID, 删除与更新一样, 也需要一个唯一标识
     */
    @DeleteMapping(value = "/{role}/{id}")
    public Map<String, Object> delete(@PathVariable String role, @PathVariable Long id){
        if (StringUtils.hasText(role)) {
            if (!role.equals("学生") && !role.equals("教师") && !role.equals("超级管理员")) {
                throw new GlobalRuntimeException(ErrorCodes.PARAMS_ERROR, "无效的角色类型");
            }
            userService.delete(role, id);
            return ResultUtils.ok();
        } else {
            throw new GlobalRuntimeException(ErrorCodes.PARAMS_ERROR, "请指定用户角色");
        }
    }

    /**
    * 查询用户数量, 接收"HTTP GET"请求
    */
    @GetMapping(value = "/count")
    public Map<String, Object> count(){
        Long count = userService.count();
        return ResultUtils.ok(null == count ? 0L : count);
    }

    /**
    * 日新增统计
    */
    @GetMapping(value = "/day-newly-added")
    public Map<String, Object> dayNewlyAdded(){
        // 今天
        Date endDate = DateUtils.getNow();
        // 30天以前
        Date beginDate = DateUtils.dayAfter(endDate, -30);
        List<DataGroupByDateDto> dataList = userService.countByDay(beginDate, endDate);
        return ResultUtils.ok(dataList);
    }

    /**
     * 批量导入用户, 接收"HTTP POST"请求
     * @param userList   用户列表
     */
    @PostMapping("/bulk-import")
    public Map<String, Object> bulkImport(@RequestBody List<UserAddDto> userList) {
        Map<String, Object> result = userService.bulkImport(userList);
        return ResultUtils.ok(result);
    }
}
